import random

#一、定义一个学生Student类。有下面的实例属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:zm = Student('zhangming',20,[69,88,100])

# class Student:
#     def __init__(self,name:str,age:int,score:list):
#         self.name=name
#         self.age=age
#         self.score={"语文":score[0],"数学":score[1],"英语":score[2]}
#         information={"姓名":self.name,"年龄":self.age,"成绩":self.score}
#
#         with open("student.txt","r",encoding="utf-8")  as b:
#             data=b.read()
#         if f"'姓名': '{self.name}'" not in data:
#             with open("student.txt","a",encoding="utf-8") as b:
#                 b.write(str(information)+"\n")
#
#     def get_name(self):
#         return f"学生的姓名为：{self.name}"
#     def get_age(self):
#         return f"学生的年龄为：{self.age}"
#     def get_course(self):
#         max(self.score,key=lambda name:self.score[name])   #匿名函数
#         return f"学生的姓名为：{self.name}，最高的科目成绩为：{max(self.score,key=lambda name:self.score[name])}"
#     @classmethod
#
#     def all_student(self):
#         with open("student.txt","r",encoding="utf-8") as b:
#             for index,value in enumerate(b.readlines()):
#                 print(f"第{index+1}个学生的信息为：{value.strip()}")
#
# if __name__ == '__main__':
#     zm = Student('zhangming', 20, [69, 88, 100])
#     zs = Student('zhangsan', 20, [69, 88, 100])
#     print(zm.get_name())
#     print(zs.get_age())
#     print(zs.get_course())
#     Student.all_student()




# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)

# class Dictclass:
#     def __init__(self,information:dict):
#         self.information=information
#
#
#     def delete(self,key):
#         if key in self.information:
#             self.information.pop(key)
#             return "删除成功"
#         else:
#             return f"{key}不存在,删除失败"
#
#     def find(self,key):
#         if key in self.information:
#             return self.information[key]
#         else:
#             return "not found"
#
#     def display(self):
#         return list(self.information.keys())    #返回所有的keys
#
#     def merge(self,dict2):
#         self.information.update(dict2)
#         return list(self.information.values())    #返回所有的values
#
#
# if __name__ == '__main__':
    # a=Dictclass({"name":"张三","age":18})
    # print(a.information)   #查看该字典
    # print(a.delete("age"))   #删除key
    # print(a.information)

    # print(a.find("age"))
    # print(a.display())   #展示所有的keys

    # print(a.merge({"address":"沈阳"}))
    # print(a.information)


#获取keys的用法
# dict2 = {"name":"suki","age":19,"address":"辽宁沈阳","phone_number":"1213543523"}
# print(list(dict2.keys()))    #将所有的kys返回成列表形式




# 三、定义一个列表的操作类：Listinfo
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]   列表合并自己传入
# 4 删除并且返回最后一个元素：del_key()
# class Listinfo:
#     def __init__(self,information:list):
#         self.information=information
#
#     def add_key(self,keyname):
#         self.information.append(keyname)
#         return f"添加成功：{keyname}"
#
#     def get_key(self,n):    #输出第n个数
#         try:
#             return self.information[n-1]
#         except:
#             return f"值：{n}不在列表里"
#
#     def update_list(self,list2):
#         self.information=self.information+list2
#         return self.information
#
#     def del_key(self):
#         a=self.information.pop(len(self.information)-1)
#         return f"{a}已删除"
#
# if __name__ == '__main__':
#     aaa=Listinfo([1,2,3,4,5])
#     print(aaa.add_key("张三"))
#     print(aaa.information)
#
#     print(aaa.get_key(2))
#     print(aaa.update_list(["啦啦啦","哈哈哈"]))
#     print(aaa.del_key())
#     print(aaa.information)





# 四、做一个学生点名系统:存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！

# class Student:
#     information={}
#     def insert(self,name,age,address,phone):
#         if name not in self.information:
#             self.information[name]={"年龄":age,"地址":address,"手机号码":phone}
#             print(f"存入成功:{name}")
#         else:
#             print("存入失败，已存在")
#
#     def update(self,name,new_name,age,address,phone):
#         if name in self.information:
#             self.information.pop(name)
#             self.information[new_name]={"年龄":age,"地址":address,"手机号码":phone}
#             print(f"更新成功:{name}已更改,{new_name}为现名字")
#         else:
#             print("更新失败，学生姓名不存在")
#
#     def delete(self,name):
#         if name in self.information:
#             self.information.pop(name)
#             print(f"删除成功{name}")
#         else:
#             print("删除失败，学生姓名不存在")
#
#     def display(self):
#         for index,value in enumerate(self.information):
#             print(f"第{index+1}个学生姓名为：{value},学生年龄为:{self.information[value]['年龄']}，地址为:{self.information[value]['地址']},手机号为:{self.information[value]['手机号码']}")
#
#     def random_student(self):
#         a=random.choice(list(self.information.keys()))
#         print(f"{a}到！")
#
# if __name__ == '__main__':
#     aaa=Student()
#     aaa.insert("张三",18,"北京","13233333333")
#     aaa.insert("李四", 19, "上海", "13166666666")
#     aaa.insert("王五", 22, "沈阳", "13888888888")
#     aaa.insert("老六", 29, "苏州", "13000000000")
#
#     aaa.update("张三","张张三三",188,"beijing","12222222222")
#     print(aaa.information)     #查看列表
#
#     aaa.delete("李四")
#     aaa.display()
#
#     aaa.random_student()



# 五、点餐管理系统
# 1》新增菜品、下架菜品、修改菜品
# 2》每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，每道菜不允许超过15元，没有小数单位，均为整数
# 3》餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
# class Ins:
#     dict1={}
#     def insert(self,name,price):
#         if price>15:
#             print("新增失败，价格大于15")
#         else:
#             self.dict1[name]={"价格":price,"库存":999,"分数":[]}
#             print(f"新增成功：{name}")
#
#     def delete(self,name):
#         if name in self.dict1:
#             self.dict1.pop(name)
#             print(f"删除菜品{name}成功")
#         else:
#             print("删除失败，菜品不存在")
#
#     def update(self,name,new_name,new_price):
#         if name in self.dict1:
#             inventory=self.dict1[name]["库存"]
#             score_list=self.dict1[name]["分数"]
#             self.dict1.pop(name)
#             self.dict1[new_name]={"价格":new_price,"库存":inventory,"分数":score_list}
#             print(f"{name}更新成功,新菜品名为{new_name}，新价格为{new_price}")
#         else:
#             print("更新失败，菜品名不存在")
#
#     def dish_out(self,name):
#         self.dict1[name]["库存"]=self.dict1[name]["库存"]-1
#         score=int(input("请输入你对该菜品的评分（0~5分）："))
#         if score>=0 and score<=5:
#             self.dict1[name]["分数"].append(score)   #分数列表list中append
#
#     def display(self):
#         dict2={}
#         result=[]    #没被淘汰的菜品
#         for key,value in self.dict1.items():
#             try:    #dict2={”菜品名“:2分}
#                 dict2[key]=sum(self.dict1[key]["分数"])  /  len(self.dict1[key]["分数"])
#             except:
#                 dict2[key]=0
#
#         for key,value in dict2.items():
#             if value<3:
#                 pass
#             else:
#                 result.append(key)   #分数>3的进result空列表list里
#
#         if result:
#             print(f"最终分数>3的菜品为：{result}")
#         else:
#             print("所有菜品都被淘汰了")
#
#         print(dict2)
#         print(result)
#
#
# if __name__ == '__main__':
#     a=Ins()
#     a.insert("锅包肉",12)
#     a.insert("鱼香肉丝",10)
#     a.insert("溜肉段",5)
    # print(a.dict1)
    #
    # a.delete("锅包肉")
    # print(a.dict1)

    # a.update("鱼香肉丝","肉丝",1)
    # print(a.dict1)
    #
    # a.dish_out("锅包肉")
    # a.dish_out("锅包肉")
    # a.dish_out("锅包肉")
    # print(a.dict1)       #要输好几遍，否则每跑一遍只会留下一个评分

    # a.display()










# 六、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
# class Desk:
#     def __init__(self,length,width,height):
#         self.length=length
#         self.width=width
#         self.height=height
#
#     def showInfo(self):
#         print(f"长:{self.length},宽:{self.width},高:{self.height}")
#
# desk1=Desk(1,3,5)
# desk2=Desk(22,33,44)
# desk1.showInfo()
# desk2.showInfo()



# 七、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性
# class User:
#     username="admin"
#     password="123456"


#八、定义一个计算器类，有加减乘除四个方法
# class Calculator:
#     def __init__(self,n1,n2):
#         self.n1=n1
#         self.n2=n2
#
#     def increase(self):
#         return self.n1 + self.n2
#
#     def decrease(self):
#         return self.n1-self.n2
#
#     def multiply(self):
#         return self.n1*self.n2
#
#     def divide(self):
#         return self.n1/self.n2
#
# if __name__ == '__main__':
#     a=Calculator(2,8)
#     print(a.increase())
#     print(a.decrease())
#     print(a.multiply())
#     print(a.divide())





# 九、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
# class Person:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def greet(self):
#         print(f"你好,{self.name},你的年龄是{self.age}")
#
# your1=Person("张三",18)
# your2=Person("老六",78)
# your1.greet()
# your2.greet()



# 十、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
# class Ins:
#     def insert(self,name,author,time):
#         with open("book.txt","r",encoding="utf-8") as b:
#             data=b.read()
#         if f"图书名：{name}" not in data:
#             with open("book.txt","a",encoding="utf-8") as b:
#                 b.write(f"图书名：{name}，作者：{author}，创建时间：{time}\n")
#         else:
#             print(f"新增失败，图书名{name}已存在")
#
#     def update(self,name,new_name,author,time):
#         with open("book.txt","r",encoding="utf-8") as b:
#             data=b.read()
#         if  f"图书名：{name}" not in data:
#             print(f"修改失败，图书名{name}不存在")
#         else:
#             with open("book.txt","r",encoding="utf-8") as b:
#                 data1=b.readlines()
#
#             with open("book.txt","w",encoding="utf-8") as b:
#                 for i in data1:
#                     if f"图书名：{name}" in i:
#                         data1.remove(i)
#                 data1.append(f"图书名：{new_name}，作者：{author}，创建时间：{time}\n")
#                 b.writelines(data1)     #读是data=readlines，写入也是writelines 的data  wirte覆盖
#                 print("修改成功")
#
#     def delete(self,name):
#         with open("book.txt","r",encoding="utf-8") as b:
#             data=b.read()
#
#         if f"图书名：{name}" not in data:
#             print(f"删除失败，图书名{name}不存在")
#         else:
#             with open("book.txt", "r", encoding="utf-8") as b:
#                 data1 = b.readlines()
#
#             with open("book.txt", "w", encoding="utf-8") as b:
#                 for i in data1:
#                     if f"图书名：{name}" in i:
#                         data1.remove(i)
#
#                 b.writelines(data1)
#                 print(f"删除{name}成功")
#
#     def display(self,type):
#         if type=="1" or type==1:
#             name1=input("请输入要查询的图书名称：")
#             with open("book.txt", "r", encoding="utf-8") as b:
#                 data1=b.readlines()   # 跟迭代器是一样的，有指针的概念，如果之前都拿走了，下次再拿就是空的了
#             with open("book.txt", "r", encoding="utf-8") as b:
#                 data2=b.read()    # 避免是空的，再创建一个篮子取鸡蛋
#
#             if f"图书名：{name1}" in data2:
#                 for i in data1:
#                     if f"图书名：{name1}"==i.split("，")[0]:
#                         print(f"当前图书信息为：{i}")
#             else:
#                 print("图书不存在，查找失败")
#
#         elif type=="2" or type==2:
#             with open("book.txt", "r", encoding="utf-8") as b:
#                 print(b.read())
#
#
# if __name__ == '__main__':
#     a=Ins()
#     a.insert("三国","罗贯中","2024-2-2")
#     a.insert("红楼梦","曹雪芹","2024-3-3")
#     a.insert("西游记","吴承恩","2023-1-1")
#
#     a.display(1)




# 十一、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
# class Car:
#     def __init__(self,brand,color):
#         self.brand=brand
#         self.color=color
#
#     def start_engine(self):
#         print("启动汽车引擎！")
#     def stop_engine(self):
#         print("关闭汽车引擎！")
# my_car=Car("福特","黄色")
# print(my_car.brand)
# print(my_car.color)
# my_car.start_engine()
# my_car.stop_engine()




# 十二
#  （1） 可以添加商品，商家添加完的商品会存到商品列表  (商品名称、sku/商品编号、价格)
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品下架，下架后的商品不再展示
# class Ins:
#     information={}
# 
#     def insert(self,name,sku,price):
#         if name not in self.information:
#             self.information[name]={"sku商品编号":sku,"价格":price}
#             print(f"存入成功：{name}")
#         else:
#             print(f"存入失败，{name}已存在")
# 
#     def update(self,name,new_name,sku,price):
#         if name in self.information:
#             self.information.pop(name)
#             self.information[new_name]={"sku商品编号":sku,"价格":price}
#             print(f"更新成功：{name}的有关信息已更改，新信息为：{new_name}、{sku}、{price}")
#         else:
#             print(f"更新失败，{name}不存在")
# 
#     def delete(self,name):
#         if name in self.information:
#             self.information.pop(name)
#             print(f"{name}删除成功")
#         else:
#             print(f"删除失败，{name}不存在")
# 
# if __name__ == '__main__':
#     a=Ins()
#     a.insert("饮料","123455","12")
#     a.insert("零食","222222","20")
#     a.insert("家具","998899","40")
    # print(a.information)

    # a.delete("零食")
    # print(a.information)
    # 
    # a.update("家具","家家具具","666666","999")
    # print(a.information)

















# 十三、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
# class Person:
#     def __init__(self,name,weight):
#         self.name=name
#         self.weight=weight
#
#     def run(self):
#         self.weight=self.weight-0.5
#         print(f"跑步者:{self.name},体重减少0.5公斤,现体重:{self.weight}公斤")
#     def eat(self):
#         self.weight=self.weight+1
#         print(f"进食者:{self.name},体重增加1公斤,现体重:{self.weight}公斤")
#     def information(self):
#         return f"姓名:{self.name},体重:{self.weight}"
#
# mei=Person("小美",45.0)
# ming=Person("小明",75.0)
# mei.run()
# ming.run()
# mei.eat()
# ming.eat()
# print(mei.information())
# print(ming.information())



# 十四、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
# class Gun:
#     def __init__(self,bullets):
#         self.bullets=bullets
#     def shoot(self):
#         if self.bullets>0:
#             self.bullets=self.bullets-1
#             print(f"子弹发射出一枚,还剩子弹:{self.bullets}")
#         else:
#             print("没有子弹了，发射失败")
#
#     def reload(self,num):
#         self.bullets = self.bullets +num
#         print(f"装填:{num},当前子弹:{self.bullets}")
#
# ruien=Gun(5)
# ruien.shoot()
# ruien.reload(2)















